列情報は、ttXlaColDesc_t構造体を使用して提供されます。この構造体は、ttXlaGetColumnInfo関数によって返されます。
この構造体には、次のフィールドが含まれています。
フィールド
|
型
|
説明
|
---|---|---|
header | 標準データ・ヘッダー。 |
|
colName[tt_NameLenMax] | char | 列の名前。 |
pad0 | SQLUINTEGER | 4バイト境界まで埋め込みます。 |
sysColNum | SQLUINTEGER | 列番号(1から始まります)。 |
userColNum | SQLUINTEGER | ユーザー割当ての列番号。 |
dataType | SQLUINTEGER | ODBC TTXLA_*コードの構造体。 表3.1を参照してください。 |
size | SQLUINTEGER | 列の最大サイズまたは基本サイズ。 |
offset | SQLUINTEGER | 列の固定長部分に対するオフセット。 |
nullOffset | SQLUINTEGER | NULLバイトに対するオフセット(NULL値可能でない場合は0(ゼロ)です)。 |
precision | SQLSMALLINT | DECIMAL型の数値の精度。 |
scale | SQLSMALLINT | DECIMAL型の数値のスケール。 |
flags | SQLUINTEGER | 列フラグ。 |
ttXlaColDesc_t構造体を取得する手順およびその内容を確認する手順は、「列データの確認」を参照してください。次に、これらの手順の概要を示します。
ttXlaColDesc_t構造体は、ttXlaGetColumnInfo関数によって返されます。この構造体には、特定の表の列情報にアクセスするために必要なメタデータが格納されています。たとえば、offsetフィールドを使用すると、ttXlaUpdateDesc_t構造体の後の更新レコードに返された行(一行または複数行)の特定の列データを検出できます。列値のアドレスは、返された行のアドレスにoffsetを追加して検出することができます。その後、dataTypeフィールドに基づいてこの値を対応するC型にキャストしたり、「複合データ型の変換」で説明されている変換ルーチンの1つに渡すことができます。
TimesTenの行データは、固定長データおよびその後に続く可変長データで構成されます。
NULL値が含まれる可能性がある列の場合、nullOffset はレコードのNULLバイトを指します。この値は、列がNULLの場合は1、NULLでない場合は0(ゼロ)になります。詳細は、「NULL値の検出」を参照してください。
flagsビットは、列がNULL値可能であるかどうか、主キーの一部となるかどうか、またはアウトラインで格納されるかどうかを定義します。
sysColNum値は、列に割り当てるシステム列番号です。この値は、最初の列に対しては1から始まります。
固定長列データの場合、列のアドレスは、ttXlaColDesc_t構造体のoffset値に行のアドレスを追加したものです。
ttXlaColDesc_t colDesc;
void* pColVal = colDesc->offset + row;
列の値は、データ型に対応する型ポインタを使用してこのポインタを参照解除すると取得できます。たとえば、SQL_INTEGERの場合、ODBC型はSQLINTEGERであるため、列の値は次のように入力すると取得できます。
*((SQLINTEGER*) pColVal))
可変長列データの場合、前述の手順で計算されたpColValは4バイトのオフセット値のアドレスになります。このオフセット値をpColValのアドレスに追加すると、可変長列データの先頭を指すポインタが示されます。64ビットのプラットフォームで処理が行われると想定すると、この場所の最初の8バイトはこのデータの長さ(var_len)で、その後に実際のデータ(var_data)が続きます。
この例では、VARCHAR文字列をコピーおよび出力します。
tt_ptrint* var_len = (tt_ptrint*)((char*)pColVal +
*((int*)pColVal));
char* var_data = (char*)(var_len+1);
char *buffer = malloc(*var_len+1);
memcpy(buffer,var_data,*var_len);
buffer[*var_len] = (char)NULL; /* NULL terminate the string */
printf("%s\n",buffer);
free(buffer);